昨天再經過python後端API的CRUD開發之後
高速的服務提供者Fast API
今天會介紹React的基本使用方式
不過我會講道說為什麼會使用這些框架,跟傳統三劍客(HTML、JS、CSS)有什麼差別
以及React(前端)工程師在開發時的會思考的東西
今天會學到
1.前端工程師該思考的事情
2.React的建置跟基本語法
3.前後端的交互
# | 注意事項 | 說明 |
---|---|---|
1 | UI/UX 設計 | 確保應用程式具有流暢、直觀的使用體驗(UX)和美觀、一致的介面設計(UI),以提升用戶滿意度。 |
2 | 狀態儲存與管理 | 使用狀態管理工具(如Redux、Vuex、MobX)管理應用的全局狀態,確保資料流動一致,方便擴展和調試。 |
3 | HTTP 請求與 API 交互 | 通過工具(如fetch 或Axios)發送HTTP請求,處理數據的異步操作,並考慮API請求的安全性與錯誤處理。 |
4 | 組件化開發 | 將應用拆分為小型可重用組件,管理組件之間的資料流動,提高代碼結構的可維護性和可讀性。 |
5 | 響應式設計與跨裝置兼容性 | 透過CSS媒體查詢確保應用適應不同螢幕尺寸,並確保應用在主流瀏覽器上的表現一致。 |
6 | 性能優化 | 優化資源加載、代碼分割、圖片Lazy Loading等技術,確保應用加載迅速並提升用戶體驗。 |
7 | 無障礙設計(A11y) | 確保網站對於有視覺、聽覺或其他障礙的用戶可訪問,遵循WCAG標準,提供鍵盤導航等無障礙功能。 |
8 | 安全性 | 防範XSS、CSRF等攻擊,進行輸入驗證,確保應用數據的安全性,並使用身份驗證來保護API請求。 |
9 | 國際化(i18n)和本地化(l10n) | 支持多語言和多地區的需求,提供日期、貨幣等本地格式的動態切換功能,以適應不同市場。 |
10 | 動效與過渡效果 | 使用CSS或JavaScript的動效提升用戶體驗,但要平衡性能,確保應用運行流暢且不卡頓。 |
這幾個都是前端工程師的必學技能
不過就新手而言我建議先朝HTTP 請求與 API 交互
、 組件化開發
、響應式設計與跨裝置兼容性
三個方向去學習
為什麼呢~!?
這個也是我個人的主觀見解
今天在開發一個網站應用程式(Web Application)
最重要的是:
HTTP請求與API交互(儲存使用者的資料=>前端傳到後端資料庫存放
)
組件化開發 透過現代前端框架有效的拆分組件(類似python modular programming的概念)
響應式設計 各種裝置平台瀏覽都有最適應的畫面
這個圖在前面也有呈現過類似的
但今天以前端工程師角度來說會思考更多點
大家可以參考下面的重點,還有我個人的心得補充
async/await
或Promise
來處理HTTP請求,確保不會阻塞前端其他操作。可以想像成今天你在早餐店點了奶茶跟烤巧克力土司
有沒有發現重點!?
今天所有動作都不會一樣一樣完成(點餐->收錢->烤土司->做奶茶->打包)
而是會拆解處理的動作,我最喜歡用早餐店老闆娘解釋這個情境XDD
這個就很常看到了,今天如果是網路問題通常會直接跳伺服器引擎的錯誤看不到畫面(nginx error)
但如果是API請求失敗,比如說你案送出按鈕,後端回傳失敗,這時候前端工程師接到錯誤就要呈現錯誤畫面。
AbortController
來取消不再需要的請求。我們可以創建一個範例
功能是一個counter畫面以及按鈕可以控制加減的網頁
直接讓大家看到下面的程式來比較
html開發counter功能(畫面、控制按鈕) 左邊
vs
React 組件化開發功能(Counter父組件、Counter Display、 Counter Control) 右邊
優點
缺點
使用場景
優點
useState
、useEffect
)管理狀態和副作用,使狀態變化更為簡單和直觀。缺點
使用場景
這邊不會講到艱澀的RWD開發模式
不過可以讓大家了解這個模式的應用會有什麼差別
IT邦的畫面
桌面版本
手機版本
類別 | 優點 | 缺點 | 應用場景 |
---|---|---|---|
RWD | - 提高使用者體驗,適應各種裝置 | - 開發時間可能較長,需考慮多種設備的適配 | - 中大型網站,需支援各種裝置的網站 |
- 透過單一代碼庫簡化維護 | - 需要更複雜的CSS和JavaScript | - 需要在行動裝置和桌面裝置上保持一致性的網站 | |
- 有助於SEO,Google更喜歡響應式設計 | - 可能出現性能問題,特別是在低效的設備上 | - 電子商務平台,提升用戶購物體驗 | |
- 提升加載速度,避免重複內容 | - 測試和調試工作量增加 | - 需要高互動性的網站,例如社交媒體平台 |
前端框架要運行的環境一定要安裝nodejs
https://nodejs.org/zh-tw
使用vite建立 react
可以使用這種交互命令的方式自己選擇(react(有一堆框架可以點,用上下選react按enter
) -> javascript)
npm create vite@latest
或是直接用template-react來操作(reactapp
是我命名的名字)
$ npm create vite@latest reactapp --template react
進去裡面可以按照步驟
npm install
npm run dev
接者輸入http://localhost:5173/
應該就可以看到我們成功運行react app搂~
恭喜學會前端了(X)
等等~這只是開始呢~地獄門才剛進去
** Vite + React 基本檔案目錄結構與說明**
.
├── public/
│ └── index.html # 入口 HTML 文件
├── src/
│ ├── assets/ # 靜態資源 (圖片、樣式等)
│ ├── components/ # React 組件
│ ├── App.jsx # 主 React 組件,應用入口
│ ├── main.jsx # 應用啟動文件,掛載 React 進入點
│ └── index.css # 全局樣式
├── .gitignore # 忽略的文件規則(Git)
├── package.json # 項目配置文件,定義依賴和腳本
├── vite.config.js # Vite 配置文件
├── README.md # 項目簡介與說明
└── node_modules/ # 依賴庫目錄(自動生成)
src/components/
: 用於存放 React 的各個組件,這是項目組件化的基礎。src/App.jsx
: 主 React 組件,通常用於定義應用的整體結構與路由等。丟給夥伴使用可以快速安裝相同的套件庫
)剛開始的npm install安裝完的套件庫會放這邊,通常nodejs開發的環境都會裝到當前資料前而非全域喔!!
)這邊在安裝完後主要會使用到的只有app.jsx跟component/底下的組件
通常新手我會建議把assets,css刪掉避免過多檔案混淆學習
tips React的HTML
大家看到這張圖有沒有覺得似曾相似
沒錯我們曾經在爬蟲實的時候有學習過
當初為什麼抓不到html tag
其實就是因為這個原因
在前端框架中通常html進入點都只有<div id = root><div>
的 root html tag進入
剩下的畫面都是透過Javascript動態產生
那組件我們可以很簡單理解就是畫面的功能
我們可以透過jsx的語法來實現
jsx的基本介紹
JSX 是 JavaScript 的一種語法擴展,允許你在 JavaScript 代碼中寫類似 HTML 的語法,並用來描述 React 元素的樹狀結構。JSX 讓編寫 React 組件變得更加直觀和便捷。
順序就是JSX(翻譯過後) -> Javascript ->HTML
大括號可以塞javascript變數
)<img /> 或 <input />
等無子元素的標籤需要自閉合。我是JSX
// 一個簡單的 React 組件使用 JSX
import React from 'react';
function Greeting(props) {
return (
<div>
<h1>Hello, {props.name}!</h1>
<p>Welcome to the world of JSX and React.</p>
</div>
);
}
export default Greeting;
我是Javascript
React.createElement(
'div',
null,
React.createElement('h1', null, 'Hello, ', props.name, '!'),
React.createElement('p', null, 'Welcome to the world of JSX and React.')
);
我是html
<div>
<h1>Hello, John!</h1>
<p>Welcome to the world of JSX and React.</p>
</div>
經過前面的簡易介紹我們今天就把程式碼串接起來吧
雖然我不會詳細的講解javascript跟jsx
但是我會把必要的邏輯講解後再大家看
不過相信對學到這邊python的你
javascript不會太難的XDD
我們把昨天的Fast API運行起來吧~!!
接者我們要安裝axios
npm install axios
Axios 是一個基於 Promise 的 HTTP 客戶端,用於瀏覽器和 Node.js 中發送 HTTP 請求。它可以用來處理與伺服器之間的數據交換,例如 GET、POST、PUT、DELETE 等請求。它比傳統的 XMLHttpRequest 更加簡潔,並且可以自動處理 JSON 數據。
簡單說就是讓我們跟後端api界街的工具庫
** Axios 的特點 **
今天很簡單我們就是目標要把Postman 測試的到的Get API 資料傳回來
首先我們先打開前端的資料夾App.jsx
把這串react程式碼貼過去
在npm run dev運行程式碼
如果網站有噴錯誤(應該說肯定)
我們要先把css跟svg在main.jsx使用到的css砍掉
// src/App.jsx
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function App() {
const [customers, setCustomers] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
// 使用 axios 發送 GET 請求
axios.get('http://127.0.0.1:8000/customers/')
.then(response => {
setCustomers(response.data); // 將 API 返回的數據設置到 state 中
setLoading(false); // 請求完成後設置 loading 為 false
})
.catch(err => {
setError(err); // 設置錯誤狀態
setLoading(false);
});
}, []);
if (loading) {
return <div>Loading...</div>;
}
if (error) {
return <div>Error: {error.message}</div>;
}
return (
<div>
<h1>Customers</h1>
<ul>
{customers.map(customer => (
<li key={customer.id}>{customer.name}</li>
))}
</ul>
</div>
);
}
export default App;
我們透過這串React前端期望可以先把昨天後端Get回來呈現到畫面上
但實際上會看到這個
CORS(Cross-Origin Resource Sharing)
是一種安全機制,允許網頁從不同的域名請求資源。這是為了克服瀏覽器的同源政策(Same-Origin Policy),該政策限制了網頁只能訪問與其來源相同的資源。CORS 通過 HTTP 標頭來告訴瀏覽器哪些外部來源可以訪問特定的資源。
CORS 的主要功能
http://example.com:80
和 http://example.com:3000
被認為是不同的來源。這也是為什麼都是在本機執行但不能通,因為前端(port 5173) 跟後端port 8000
不一樣,瀏覽器判定不同源後端修改 在昨天的server.py新增cors套件
#import新的東西進來
from fastapi.middleware.cors import CORSMiddleware
#這行不變
app = FastAPI()
#這段落新增
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 或者指定你的前端網址,例如 ["http://localhost:3000"]
allow_credentials=True,
allow_methods=["*"], # 允許所有 HTTP 方法,例如 GET、POST、PUT、DELETE 等
allow_headers=["*"], # 允許所有請求標頭
)
厲害吧只要有安裝fast api就會有幫忙處理的middleware喔
重新運行server.py後
我們再重新看前端畫面就會有瞜~!!
import React, { useState, useEffect } from 'react';
import axios from 'axios';
react 組件都是用function來定義
function App() {
}
const [customers, setCustomers] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
Rreact 可以透過狀態改變,自動重新渲染組件
=> 就是有值改變會自動重新刷新不用重整,強吧!!
useEffect(() => {
axios.get('http://127.0.0.1:8000/customers/')
.then(response => {
setCustomers(response.data); // 將 API 返回的數據設置到 state 中
setLoading(false); // 請求完成後設置 loading 為 false
})
.catch(err => {
setError(err); // 設置錯誤狀態
setLoading(false);
});
}, []);
useEffect: 在組件首次渲染時執行這段代碼,發送 GET 請求到後端 API (http://127.0.0.1:8000/customers/)。
axios.get: 發送請求,然後根據結果執行以下操作:
.then: 請求成功後,將返回的數據(response.data)設置到 customers 狀態中,並將 loading 設置為 false。
.catch: 如果請求失敗,將錯誤信息設置到 error 狀態中,並將 loading 設置為 false。
return (
<div>
<h1>Customers</h1>
<ul>
{customers.map(customer => (
<li key={customer.id}>{customer.name}</li>
))}
</ul>
</div>
);
}
如果加載完成且沒有錯誤,則顯示客戶的列表。
使用 map 函數遍歷 customers 陣列,為每個客戶創建一個元素,顯示客戶的姓名。
使用 customer.id 作為 key 屬性,以確保每個元素都有唯一的標識。
今天學到了一些前端的梅梅角角
因為時間的關係來不及補充玩
不過希望透過這篇可以學習到前端基本知識
後續的(Post,Put,Delete可以讓大家練習看看XDD) => 其實這三個才是最難的XDD
以及交互應用的場景喔~!!